feat(api): tren-f — TENANT-001 T3 + T4a: tenant sınırı efektif bayrağı ve WS kabuk borusu - #96
Merged
Conversation
…enant-scope Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…inal yüzeylerinde Kalan iki merkezi NULL-tenant sitesi kapatıldı: /api/plan ingress'i ve /api/terminal/* (kabuk erişimi taşıdığı için tenant sınırının en duyarlı yüzeyi). İkisi de T2'nin resolveApiCallerTenant kararına bağlandı — strict AÇIK: tenant-claim'siz çağıran 403; strict KAPALI: v1 bayt-değişmez. Doğrulama notu: patch'lenen ilk site 410 ile emekli /api/start DEĞİL, canlı /api/plan uçudur (kontrol edildi — ölü koda kablo çekilmedi). Kanıt: 2 yeni resolver-kontrat pini (strict/permissive/tenant'lı + bozuk-config fail-soft), api sınıfı yeşil, tsc temiz. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…consumed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…otalarıyla sınırlı T4 ön-kontrolü iki gerçeği ortaya çıkardı; ikisi de T3'ün ifadesini daraltıyor: 1. WS upgrade HTTP handler'ından geçmiyor. attachTerminalGateway server'a 'upgrade' dinleyicisi olarak takılıyor, yani T3'te gated ettiğim /api/terminal/* HTTP rotasının dışında. Token-only auth'ta authTenant 'local' kalıyor → HTTP'de 403 alan çağıran WS üzerinden kabuk alabilir. 2. Senkron readStrictTenantIsolation yalnız proje config'ini okuyor; loadConfig defaults→global→project zinciri kuruyor. Global katmanda strict açan operatörde T2/T3'ün bağladığı 6 site sessizce permissive. Bu, 'raporlar-ama-kapatmaz kontrol' sınıfının ÜÇÜNCÜ örneği. Satır 4020 hâlâ VERIFY — hiçbir DONE iddiası şişirilmedi; yine de ifadeyi main'e düzeltilmemiş sokmamak için kapsam cümlesi daraltıldı ve kalan iş T4a/T4b/T4c olarak adlandırıldı. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rade tenant reddi Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t reddi İki yapısal açık kapatıldı; ikisi de T4 ön-kontrolünde ölçümle bulundu. 1. Efektif bayrak. Senkron okuyucu yalnız proje config'ini görüyordu, oysa loadConfig defaults→global→project zinciri kuruyor. Global katmanda strict açan operatörde T2/T3'ün bağladığı altı site sessizce permissive kalıyordu — 'raporlar-ama-kapatmaz kontrol' sınıfının üçüncü örneği. Okuyucu artık aynı zinciri yürüyor, yakın katman kazanıyor; bozuk bir katman 'görüş bildirmedi' sayılır, sessizce sertleştirmez de gevşetmez de. Global yol çözümü saf yol-modülüne indirildi ve eski yerinden yeniden export edildi: API katmanı artık toptan mock'lanan ağır config modülünü import etmiyor (aksi halde o modülü mock'layan beş test kırılıyordu), davranış ve mevcut importer'lar değişmedi. 2. WS kabuk borusu. attachTerminalGateway server'a 'upgrade' dinleyicisi olarak takılı, yani T3'te kapatılan /api/terminal/* HTTP rotalarının dışında. Strict modda tenant'ı çözülemeyen çağıran artık upgrade'de typed 4403 ile reddediliyor (HTTP 403'ün WS karşılığı) ve bridge()'e hiç ulaşılmıyor. Strict kapalıyken her iki yol da bayt-değişmez. Kanıt: gerçek-sunucu koşusu (createHttpServer + gerçek PTY backend + gerçek ws istemcisi, mock yok) strict AÇIK'ta 4403 kapanışını, strict KAPALI'da açık kalan soketi gösteriyor. Harness ilk sürümde yanlış negatif verdi: gateway el-sıkışmayı tamamlayıp sonra kapatıyor (mevcut 4401 yolu da öyle), bu yüzden prob 'open' ile 'sunucu kapattı mı' ayrımını yapacak şekilde düzeltildi. Ek 4 birim pini + 3 katman-öncelik pini; api+core: 622 dosya / 10176 test yeşil. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…azelendi Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…edi) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Gerçek-sunucu pini yalnız '4403 ile kapatıldı'yı doğruluyordu. El-sıkışma tamamlandığı için bu, soketin kısa süre köprülenip sonra kapandığı bir dünyayla da uyumluydu — kabuk borusunda 'geç reddetme' ile 'hiç köprülememe' farklı güvenlik özellikleridir. Pin artık iki şeyi daha doğruluyor: reddedilen upgrade'den sonra HİÇ oturum yaratılmıyor ve el-sıkışma biter bitmez gönderilen create çerçevesine HİÇ yanıt dönmüyor. İkisi de yeşil → reddetme geç değil. Ayrıca permissive durum gerçekten PTY açtığından (kanıtın anlamı bu), afterEach oturumları açıkça öldürüyor: close() yalnız idle olanları topluyor, sızan kabuk koşu sonrası ayakta kalırdı. Kanıt cümlesindeki binary şerhi de netleştirildi: build atlanmadı, host guard'ı tarafından reddedildi — owner'ın build yetkilendirmesi maddeyi kapatır. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AlbSar
added this pull request to the merge queue
Aug 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ne yapıldı (düz Türkçe)
İki dilim var: T3 kalan iki HTTP girişini kapattı, T4a ise T3'ün ardından
yapılan ön-kontrolde bulunan iki yapısal açığı kapattı.
T3 —
/api/plan+/api/terminal/*HTTP rotalarıTenant iddiası olmayan çağıran sessizce
'local'kiracısına düşüyordu. İkisi deT2'nin ortak
resolveApiCallerTenantkararına bağlandı: strict AÇIK → 403,strict KAPALI → v1 bayt-değişmez.
T4a — açık #1: bayrak "açık" görünüyordu ama kapatmıyordu
Senkron okuyucu yalnız proje config'ini okuyordu; oysa
loadConfigdefaults → global → projectzinciri kuruyor. Global (filo/host) katmanındastrict açan bir operatörde T2/T3'ün bağladığı altı site sessizce permissive
kalıyordu. Bu, daha önce iki kez kapatılan "raporlar-ama-kapatmaz kontrol"
sınıfının üçüncü örneği.
Okuyucu artık aynı zinciri yürüyor (yakın katman kazanır). Bozuk bir katman
"görüş bildirmedi" sayılır — ne sessizce sertleştirir ne gevşetir. Global-config
yol çözümü saf yol-modülüne indirildi ve eski yerinden yeniden export edildi:
API katmanı artık toptan
vi.mock'lanan ağır config modülünü import etmiyor(aksi halde o modülü mock'layan beş test kırılıyordu). Davranış ve mevcut
importer'lar değişmedi.
T4a — açık #2: HTTP'de 403 alan çağıran WS'ten kabuk alabiliyordu
attachTerminalGatewaysunucuya'upgrade'dinleyicisi olarak takılı, yaniT3'te kapatılan
/api/terminal/*HTTP rotalarının dışında. Asıl PTY borusuorası. Strict modda tenant'ı çözülemeyen çağıran artık upgrade'de typed 4403
ile reddediliyor (HTTP 403'ün WS karşılığı) ve
bridge()'e hiç ulaşılmıyor.Strict kapalıyken bayt-değişmez.
Bu ikisi bulunduğu anda, uçuştaki #95'e ayrı bir kapsam-düzeltmesi commit'i
atıldı: T3'ün "terminal kapandı" ifadesi HTTP rotalarıyla sınırlandırıldı —
şişirilmiş bir iddia main'e girmesin diye.
Kanıt
Gerçek-sunucu koşusu (Tier-1):
createHttpServer+ gerçek PTY backend +gerçek
wsistemcisi, mock yok. strict AÇIK → sunucu soketi 4403 ilekapatıyor; strict KAPALI → soket açık kalıyor.
tsctemiz,lint:gatestam zincir yeşilAçık bırakılan (typed)
Paketlenmiş-binary (
deckent serve) teyidi owner-onaylı build adımıgerektiriyor ve bu dilimde alınmadı — kanıt kaynak-üstü gerçek sunucudur,
binary iddiası yoktur.
Makbuz zinciri
GR-2026-08-07-TENANT-T3-01·GR-2026-08-07-T3-SUPP-01·GR-2026-08-07-TENANT-T4A-01·GR-2026-08-07-T4A-SUPP-01— hepsi consumed.Kalan kapsam: T4b (memory-search'te tenant yüklemi hiç kurulmuyor, process
read+write, enterprise scope + audit damgaları) · T4c (CLI+MCP host-tenant
0-hardcode çözümü).
🤖 Generated with Claude Code